package com.ecp.pay.controller;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.ecp.pay.zfb.config.AlipayConfig;
import com.ecp.pay.zfb.util.AlipayNotify;
import com.ecp.pay.zfb.util.AlipaySubmit;
import com.ecp.util.WebUtil;

/**
 * * @author shichao;
 * 
 * @date 2015年11月3日 上午11:23:00
 */
@Controller
public class ZFBController {

	public static String	app_http			= "https://mapi.alipay.com/gateway.do?";

	// public static String service = Global.SERVER_ADDR;
	public static String	service				= "http://shuyangyangyong.oicp.net";

	public static String	success_show_url	= service + "/success.jsp";

	public static String	ansy_url			= service + "/flight/ZFBPc/ansyCallBack.do";

	@RequestMapping("/flight/ZFBPc/ansyCallBack.do")
	public ModelAndView ansyCallBack(HttpServletRequest request, HttpServletResponse response)
			throws IOException, Exception {

		try {
			// 获取支付宝POST过来反馈信息
			Map<String, String> params = new HashMap<String, String>();
			Map requestParams = request.getParameterMap();
			for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
				String name = (String) iter.next();
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr
							+ values[i] + ",";
				}
				// 乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				// valueStr = new String(valueStr.getBytes("ISO-8859-1"),
				// "gbk");
				params.put(name, valueStr);
			}

			// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
			// 商户订单号
			String out_trade_no = new String(request.getParameter("out_trade_no").getBytes(
					"ISO-8859-1"), "UTF-8");

			// 支付宝交易号

			String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),
					"UTF-8");

			// 交易状态
			String trade_status = new String(request.getParameter("trade_status").getBytes(
					"ISO-8859-1"), "UTF-8");
			response.getOutputStream().println("success");
			if (AlipayNotify.verify_common(params, AlipayConfig.sign_type, true)) {// 验证成功
				if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {
					//					this.flightOrderService.updateFlightOrderByCallBack(out_trade_no,
					//							SysConst.FL_ORDER_PAY_ALIPAY, "支付宝PC支付", trade_no);
				}
				response.getOutputStream().println("success"); // 请不要修改或删除
			} else {// 验证失败
				response.getOutputStream().println("fail");
			}
		} catch (Exception e) {
			e.printStackTrace();

		}
		return null;
	}

	@RequestMapping("/flight/ZFBPc/pay.do")
	public ModelAndView pay(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		String aliasCode = ServletRequestUtils.getStringParameter(request, "aliasCode", "");
		Map<String, Object> model = new HashMap<String, Object>();
		try {
			double orderAmount = 0.01D;
			String productName = "机票测试商品";
			//			FlightOrder flightOrder = this.flightOrderService.getEntity(
			//					new String[] { "aliasCode" }, new Object[] { aliasCode });
			//			if (flightOrder == null) {
			//				return new ModelAndView("/json", "json", "未找到当前机票订单");
			//			}
			//			List<FlightOrderPay> orderPays = this.flightOrderPayService.getEntityList(
			//					new String[] { "objId" }, new Object[] { flightOrder.getId() }, new Page());
			//			for (FlightOrderPay orderPay : orderPays) {
			//				if (orderPay.getStatus() == SysConst.FL_ORDER_PAY_STATUS_UNPAID
			//						&& orderPay.getPaymode() == SysConst.FL_ORDER_PAY_TYPE_O) {
			//					orderAmount = ArithUtil.add(orderAmount, orderPay.getPayAmt());
			//				}
			//			}
			if (orderAmount <= 0D) {
				return new ModelAndView("/json", "json", "没有需要支付的订单");
			}
			String submitStr = this.getSubmitStr(aliasCode, orderAmount, productName,
					WebUtil.getRemoteIP(request));
			model.put("submitForm", submitStr);
			return new ModelAndView("/front/pay/pay_zfb/sumbit", model);
		} catch (Exception e) {
			e.printStackTrace();
			return new ModelAndView("/json", "json", e.getMessage());
		}
	}

	private String getSubmitStr(String paySerialNum, double payMoney, String productName, String ip) {
		// //////////////////////////////////请求参数//////////////////////////////////////

		// 支付类型
		String payment_type = "1";
		// 必填，不能修改
		// 服务器异步通知页面路径
		String notify_url = ansy_url;
		// 需http://格式的完整路径，不能加?id=123这类自定义参数

		// 页面跳转同步通知页面路径
		String return_url = success_show_url;
		// 需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/

		// 商户订单号
		String out_trade_no = paySerialNum;
		// 商户网站订单系统中唯一订单号，必填

		// 订单名称
		String subject = productName;
		// 必填

		// 付款金额
		String total_fee = payMoney + "";
		// 必填

		// 订单描述

		String body = productName;
		// 商品展示地址
		// String show_url = service+"/vipCenter/listMyOrders.do";
		// 需以http://开头的完整路径，例如：http://www.商户网址.com/myorder.html

		// 防钓鱼时间戳
		String anti_phishing_key = "";
		// 若要使用请调用类文件submit中的query_timestamp函数

		// 客户端的IP地址
		String exter_invoke_ip = ip;
		// 非局域网的外网IP地址，如：221.0.0.1

		// ////////////////////////////////////////////////////////////////////////////////

		// 把请求参数打包成数组
		Map<String, String> sParaTemp = new HashMap<String, String>();
		sParaTemp.put("service", "create_direct_pay_by_user");
		sParaTemp.put("partner", AlipayConfig.partner);
		sParaTemp.put("seller_email", AlipayConfig.seller_email);
		sParaTemp.put("_input_charset", AlipayConfig.input_charset);
		sParaTemp.put("payment_type", payment_type);
		sParaTemp.put("notify_url", notify_url);
		sParaTemp.put("return_url", return_url);
		sParaTemp.put("out_trade_no", out_trade_no);
		sParaTemp.put("subject", subject);
		sParaTemp.put("total_fee", total_fee);
		sParaTemp.put("body", body);
		// sParaTemp.put("show_url", show_url);
		sParaTemp.put("anti_phishing_key", anti_phishing_key);
		sParaTemp.put("exter_invoke_ip", exter_invoke_ip);

		// 建立请求
		String sHtmlText = AlipaySubmit.buildRequest(app_http, sParaTemp, "get", "确认");
		return sHtmlText;
	}
}
